package com.qf.controller;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.qf.model.Order;
import com.qf.model.User;
import com.qf.model.UserDTO;
import com.qf.service.UserService;
import com.qf.util.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.UUID;

import static jdk.nashorn.internal.runtime.regexp.joni.Config.log;


/**
 * 天--道--酬--勤
 *
 * @author LiangGaoQiang
 * @ClassName UsesController
 * @Date: 2025/4/3 20:33
 * @Description: 描述
 */

@RestController
@CrossOrigin
public class UserController {

    private HashMap<String, Object> map = new HashMap<>();

    @Autowired
    private UserService userService;

    /**
     * 根据id查询用户
     * @param id 用户id
     * @return R
     */
    @GetMapping("/findUserById")
    public R findUserById(int id) {
        User user = userService.findUserById(id);
        return R.ok(user);
    }


    /**
     * 根据用户名查询用户
     * @param username 用户名
     * @return R
     */
    @GetMapping("/findUserByName")
    public R findUserById(String username) {
        User user = userService.findUserByName(username);
        if (user == null) {
            return R.fail();
        }
        return R.ok(user);
    }

    /**
     * 查询所有用户
     * @return R
     */
    @GetMapping("/user/findAll")
    public R findAll() {
        List<User> list = userService.findAll();
        if (list == null) {
            return R.fail();
        }
        return R.ok(list);
    }

    /**
     * 根据id查询用户及其订单信息--->一对多联查
     * @param id 用户id
     * @return R
     */
    @GetMapping("/one2more")
    public R findUserWithOrdersById(int id) {
        List<Order> orderList = userService.findUserWithOrdersById(id);
        if (orderList == null) {
            return R.fail();
        }
        return R.ok(orderList);
    }


    @GetMapping("/user/findAllByPage")
    public R findUserByPage(int pageNum, int pageSize) {
        // 开启分页查询
        // 1 先设置分页信息
        PageHelper.startPage(pageNum,pageSize);
        // 2 正常执行查询
        List<User> list = userService.findAll();
        // 3 通过查询返回的list创建出分页信息,PageInfo内包含所有分页数据,可以点入源码查看
        PageInfo<User> pageInfo = new PageInfo<>(list);
        if (pageInfo == null) {
            return R.fail();
        }
        return R.ok(pageInfo);
    }


    @GetMapping("/user/findAllByPage2")
    public R findUserByPage2(UserDTO userDTO) {
        System.out.println(userDTO.toString());
        // 开启分页查询
        // 1 先设置分页信息
        PageHelper.startPage(userDTO.getPageNum(), userDTO.getPageSize());
        // 2 正常执行查询
        List<User> list = userService.findAll2(userDTO);
        // 3 通过查询返回的list创建出分页信息,PageInfo内包含所有分页数据,可以点入源码查看
        PageInfo<User> pageInfo = new PageInfo<>(list);
        if (pageInfo == null) {
            return R.fail();
        }
        return R.ok(pageInfo);
    }


    /**
     * 根据id删除用户信息
     * @param id 用户id
     * @return R对象
     */
    @GetMapping("/delete")
    public R deleteUserById(int id) {
        int i = userService.deleteById(id);
        if (i > 0) {
            return R.ok();
        }
        return R.fail();
    }


    /**
     * 登录方法
     * @param user 用户对象
     * @return R
     */
    @PostMapping("/user/login")
    public R login(@RequestBody User user) {
        // 存一个token到map里面
        String token = UUID.randomUUID().toString();
        map.put("token", token);
        String username = user.getUsername();
        user = userService.findUserByName(username);
        map.put(token, user);
        if (user == null) {
            return R.fail();
        }
        return R.ok(map);
    }


    /**
     * 通过token获取用户信息
     * @param token 用户令牌
     * @return R对象
     */
    @GetMapping("/user/getInfo")
    public R getUserInfo(String token){
        // 通过token取出user对象，即token当键从Redis数据库中取出
        // User对象
        User user = (User) map.get(token);
        if (user == null) {
            return R.fail();
        }
        return R.ok(user);
    }


    /**
     * 用户退出
     * @param token 用户令牌
     * @return R对象
     */
    @PostMapping("/user/loginOut")
    public R loginOut(String token){
        // 将token从redis删除
        map.remove(token);
        return R.ok();
    }

    /**
     * 用户用户id列表批量删除用户
     * @param ids 用户id集合
     * @return R对象
     */
    @GetMapping("/user/deleteBatch")
    public R deleteUserByIdBatch(@RequestParam List<Integer> ids) {
        boolean flag = userService.deleteByIdBatch(ids);
        if (flag) {
            return R.ok();
        }
        return R.fail();
    }


    /**
     * 添加用户
     * @param user 前端传递的User对象
     * @return R对象
     */
    @PostMapping("/user/addUser")
    public R addUser(@RequestBody User user) {
        System.out.println("接收到的用户数据" + user); // 检查数据是否成功解析
        int i = userService.addUser(user);
        if (i > 0) {
            return R.ok();
        }
        return R.fail();
    }


    /**
     * 更新用户信息
     * @param user 待更新的User对象
     * @return R对象
     */
    @PostMapping("/user/updateUser")
    public R updateUser(@RequestBody User user) {
        int i = userService.updateUser(user);
        if (i > 0) {
            return R.ok();
        }
        return R.fail();
    }

}
